package edu.whu.demo.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import edu.whu.demo.domain.Supplier;
import edu.whu.demo.exception.ProductAdminException;
import edu.whu.demo.service.ISupplierService;

import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;


// 导入相关类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;

@RestController // 使用@RestController注解标识这是一个RESTful风格的控制器
@RequestMapping("/supplier") // 设置请求映射路径为/supplier
public class SupplierController {
    @Autowired // 自动注入ISupplierService实例
    ISupplierService supplierService;

    // 根据Id查询供应商
    @ApiOperation("根据Id查询供应商") // 设置API操作描述
    @GetMapping("/{id}") // 设置请求映射路径为/{id}，并指定请求方式为GET
    public ResponseEntity<Supplier> getSupplier(@ApiParam("供应商Id") @PathVariable long id){ // 参数说明：供应商Id为路径变量，类型为long
        Supplier result = supplierService.getById(id); // 调用服务层方法获取供应商信息
        if(result==null) { // 如果结果为空
            return ResponseEntity.noContent().build(); // 返回无内容状态码
        }else{
            return ResponseEntity.ok(result); // 返回成功状态码和供应商信息
        }
    }

    // 根据条件查询供应商
    @ApiOperation("根据条件查询供应商") // 设置API操作描述
    @GetMapping("") // 设置请求映射路径为空字符串，并指定请求方式为GET
    public IPage<Supplier> findSupplier(@ApiParam("商品名称") String name, // 参数说明：商品名称为请求参数，类型为String
                                        @ApiParam("页码") @RequestParam(defaultValue = "0") Integer pageNum, // 参数说明：页码为请求参数，默认值为0，类型为Integer
                                        @ApiParam("每页记录数") @RequestParam(defaultValue = "10") Integer pageSize){ // 参数说明：每页记录数为请求参数，默认值为10，类型为Integer
        return supplierService.findSuppliers(name, pageNum,pageSize); // 调用服务层方法查询供应商信息，并返回分页结果
    }

    // 增加供应商
    @ApiOperation("增加供应商") // 设置API操作描述
    @PostMapping("") // 设置请求映射路径为空字符串，并指定请求方式为POST
    public Supplier addProduct(@RequestBody Supplier supplier) throws ProductAdminException { // 参数说明：供应商信息为请求体，类型为Supplier
        supplierService.saveOrUpdate(supplier); // 调用服务层方法保存或更新供应商信息
        return supplier; // 返回新增的供应商信息
    }

    // 修改供应商
    @ApiOperation("修改供应商") // 设置API操作描述
    @PreAuthorize("hasAuthority('supplier/admin')") // 设置权限要求，只有具有'supplier/admin'权限的用户才能访问此接口
    @PutMapping("/{id}") // 设置请求映射路径为/{id}，并指定请求方式为PUT
    public void updateProduct(@PathVariable long id, @RequestBody Supplier supplier) throws ProductAdminException { // 参数说明：供应商Id为路径变量，类型为long，供应商信息为请求体，类型为Supplier
        // 调用服务层方法保存或更新供应商信息
        supplierService.saveOrUpdate(supplier);
    }

    // 删除供应商
    @ApiOperation("删除供应商") // 设置API操作描述
    @DeleteMapping("/{id}") // 设置请求映射路径为/{id}，并指定请求方式为DELETE
    public void deleteProduct(@PathVariable long id){ // 参数说明：供应商Id为路径变量，类型为long
        supplierService.removeById(id); // 调用服务层方法删除供应商信息
    }

}


